package com.study.kt.skills

import java.lang.IllegalArgumentException

/**
 * <pre>
 *     author : slx
 *     time   : 2021/02/07
 *     desc   :
 * </pre>
 */
fun main() {
    // runVsWith()  // 是否为扩展函数
    // runVsLet()  // 参数区别
    letVsAlso()   // 返回值
}

fun letVsAlso() {
    val name = "slx"

    // also返回自身，在使用前可以进行自我操作
    val hiName = name.also {
        println(it.length)
    }

    // let返回最后一行
    val sName = name.let {
        name.subSequence(1, 2)
    }

    // 使用also函数实现两个变量交换值
    // 先把b赋值给a，然后a also后还是返回a赋值给b
    var a = 1
    var b = 2
    b = a.also {
        a = b
    }
    println("a=$a,b=$b")
}


fun runVsLet() {
    val name: String? = null
    // run传入的参数为this，可以省略不写 简洁
    //  T.() 扩展函数，直接使用this
    name?.run {
        subSequence(1, 2)
    }

    // let 可以自定义参数名，可读性较好
    // (T) -> R 传入了自己
    name?.let { nameP ->
        println(nameP)
    }
}

// run是扩展函数，with是普通函数
// 使用run可以在之前就能判null
private fun runVsWith() {
    val name: String? = null
    with(name) {
        val subName = this?.substring(1, 2)
    }

    val sub = name?.run {
        subSequence(1, 2)
    } ?: throw  IllegalArgumentException("name must not null")
    println(sub)
}

data class Person(var desc: String)